参考文章:https://help.aliyun.com/document_detail/60152.html?spm=5176.22414175.sslink.1.1ea4617cAVoiGj
一、FTP服务器配置
第一步:准备远程服务器
这里使用阿里云轻量级应用服务器。本服务器是Ubuntu系统,由于之前项目用到了npm包管理工具,这里就基于此进行配置。
第二步:安装vsftpd,FTP服务器管理软件
2.1 连接服务器之后(通过putty软件进行命令行连接控制),输入 npm install yum。npm没有收录vsfptd,需要用到另一个包管理工具yum。
2.2 安装成功后输入systemctl enable vsftpd.service,设置服务器开机自启动
2.3 输入systemctl start vsftpd.service,启动ftp服务器
2.4 输入netstat -antup | grep ftp,检查ftp是否成功启动,查看占用端口。
第三步:配置FTP服务器
3.1 进入Linux系统的/etc/vsftpd目录下的vsftpd.config文件(可以使用Linux下的vim,也可以通过远程可视化界面访问),粘贴以下配置代码。下述配置文件为本FTP服务器的配置文件。在这里先测试被动模式。
#修改下列参数的值:
#禁止匿名登录FTP服务器。
anonymous_enable=YES
#允许本地用户登录FTP服务器。
local_enable=YES
#监听IPv4 sockets。
listen=YES
#在行首添加#注释掉以下参数:
#关闭监听IPv6 sockets。
#listen_ipv6=YES
#在配置文件的末尾添加下列参数:
#设置本地用户登录后所在目录。
local_root=/var/Vanghua
#全部用户被限制在主目录。
chroot_local_user=YES
#启用例外用户名单。
chroot_list_enable=YES
#指定例外用户列表文件,列表中用户不被锁定在主目录。
chroot_list_file=/etc/vsftpd/chroot_list
#开启被动模式。
pasv_enable=YES
allow_writeable_chroot=YES
#本示例中为Linux服务器的公网IP。
pasv_address=39.96.175.246
#设置被动模式下,建立数据传输可使用的端口范围的最小值。
#建议您把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性。
pasv_min_port=50000
#设置被动模式下,建立数据传输可使用的端口范围的最大值。
pasv_max_port=50010
3.2 配置用户,先输入adduser Danny,创建Danny用户。之后输入passwd Danny,设置该用户的密码。
3.3 配置用户登录文件夹,以及文件夹的权限。在这里注意,不进行配置时,使用该管理软件的FTP服务器会默认登录到/home/Danny的文件夹下,另外/root下的文件夹都不能被设置为默认登录文件夹。 输入chown -R Danny:Danny /var/Vanghua,设置默认登录文件夹的归属权属于Danny用户。输入chmod o+w /var/Vanghua,再输入chmod o+r /var/Vanghua,表示设置该文件夹用户拥有读写权限,注意:这一点其实在上面的vsftpd中也进行了配置,如果这里移除权限,那么vsftpd中的配置也会失效。
第四步:配置远程服务器防火墙
为FTP服务器开启指定端口,另外注意考虑TCP数据连接,也要开放端口。
安全起见,把TCP数据连接的端口设置大一些,这里范围为10。
第五步:重启FTP服务器进行测试
输入systemctl restart vsftpd.service重启FTP服务器,通过客户端主机进行连接测试
二、采用被动模式的FTP服务器
预先准备:
在linux服务器下的vsftpd.config文件中配置:
#开启被动模式
pasv_enable=YES
之后重新启动ftp服务器。
第一步:匿名连接FTP服务器
此时是FTP服务器的被动模式。
在windows环境下通过资源管理器通过ftp协议访问指定ftp服务器。在导航栏输入URL。
出现了两个对话框,第一个是尝试的匿名连接,但是是失败的,第二个是尝试的用户名密码连接。
第二步:匿名连接报文分析
在wireshark中进行TCP和FTP报文捕获。
过滤器内容为ip.src == 39.96.175.246 or ip.dst == 39.96.175.246
本截图部分展示了ftp连接,首先尝试使用匿名用户连接ftp服务器。先进行了三次TCP握手建立TCP控制连接,之后服务器发来220状态码,表示连接失败。后续又发来了原因,密码不正确。因为在服务器上设置了禁止匿名用户登录,所以连接失败。之后关掉这个对话框,观察wireshark,进行了TCP四次挥手,释放TCP控制连接。
第三步:用户名密码连接
资源管理器由于匿名访问失败,那么会自动弹出输入用户和密码的对话框。此时输入用户名和密码。
第四步:用户名密码连接报文分析
在wireshark中继续捕获TCP和FTP报文。
可见过程是首先FTP服务器返回220状态码表示连接失败,需要输入密码。之后发来331状态码,表示要验证密码。最后一切完成了,发来230状态码,表示连接成功,通过用户名和密码连接到了FTP服务器。
紧接着登录之后,可以看到客户端给FTP服务器发送来编码格式要求,FTP服务器又返回给了FTP客户端我们在设置FTP服务器默认登录路径时设置的文件夹,是linux环境下的”/var/Vanghua”,用户拥有读写删除权限。
第五步:向FTP服务器传输文件
测试TCP数据连接。在本地创建一个文件,在这里创建了一个readme.txt。然后拷贝到FTP服务器指定的文件夹下。
第六步:分析传输文件时的报文
在wireshark中分析TCP和FTP报文。
可以看到是客户端主动向服务端建立连接,客户端的60306端口向FTP服务器的50006端口进行三次TCP握手,建立TCP数据连接。这个50006端口,早在TCP控制连接建立时就已经由FTP服务器发送给客户端了。紧接着就是通过FTP报文向FTP服务器请求,要把客户端的readme.txt保存到服务器指定目录下。最后保存成功服务器返回226状态码,在返回该状态码之前,这个TCP数据连接已经经过TCP四次挥手释放掉了。
三、采用主动模式的FTP服务器
预先准备:
在linux服务器下的vsftpd.config文件中配置:
#开启被动模式
pasv_enable=NO
将被动模式关闭。
然后配置主动模式
connect_from_port_20=YES
之后重新启动ftp服务器。
第一步:匿名连接FTP服务器
此时是FTP服务器的被动模式。
在windows环境下通过资源管理器通过ftp协议访问指定ftp服务器。在导航栏输入URL。
出现了两个对话框,第一个是尝试的匿名连接,但是是失败的,第二个是尝试的用户名密码连接。
第二步:匿名连接FTP服务器报文分析
此时的情况和被动模式一样。首先进行了客户端发起的TCP三次握手,进行TCP控制连接的建立。然后FTP服务器响应了220状态码,表示登陆失败,需要验证密码。但是由于提前设置不允许匿名登录,所以这里最后FTP服务器返回了530登陆失败。
第三步:用户名密码连接FTP服务器
资源管理器由于匿名访问失败,那么会自动弹出输入用户和密码的对话框。此时输入用户名和密码。
第四步:用户名密码连接FTP服务器报文分析
此时可见建立完TCP控制连接后,FTP服务器对传来的用户名和密码进行了检验。最后返回响应230,表示登录成功。
第五步:访问FTP服务器下的某个文件夹,测试TCP数据连接
进入该文件夹。进入该文件夹,FTP服务器需要把文件夹中的内容返回给客户端,这实际上也是需要通过TCP数据连接完成的。
第六步:分析TCP数据连接相关的报文
在主动模式下进入FTP服务器的一个文件夹,观察wireshark捕获的报文。首先是TCP的三次握手,建立数据连接。从端口上可以看出来,是FTP服务器的20端口主动向客户端的64173端口发送TCP请求,进行数据连接建立。建立完成后FTP服务器返回给客户端一个FTP请求,响应是226,表示要进入的目录已经发送给客户端。